package com.pactera.madp.cp.service.sync;

import com.pactera.madp.cp.api.dto.sync.SyncDTO;

/**
 * @title 神策-日间同步-采集明细数据-业务接口定义
 *   - ① 处理同步参数(上一次同步时间最大接收时间)
 *   - ② 同步神策采集明细数据
 *   - ③ 汇总当日访客浏览数据
 *   - ④ 处理客户雷达数据
 *   - ⑤ 同步神策访客浏览汇总数据
 * @date 2022-05-13
 * @author Deming.Chang
 */
public interface SyncSaDayTimeService {

    /**
     * 同步参数-KEY
     */
    String PARAM_KEY_RECEIVE_TIME = "receiveTime";

    /**
     * 处理同步参数(上一次同步时间)
     * @param dto   同步参数
     * @return  本系统采集事件表上一次同步最大接收时间
     */
    Long handleSyncParams(SyncDTO dto);

    /**
     * 同步神策采集明细数据
     * @param lastMaxReceiveTime 本系统采集事件表上一次同步最大接收时间
     * @return  同步神策是否有数据（根据此标识，判断是否进行后续操作）
     */
    Boolean syncSaDetails(Long lastMaxReceiveTime);

    /**
     * 汇总当日访客浏览数据
     * @date 2022-05-21 修正
     * @notice: 此处不能传递上次最大接收时间，如当日无数据，则会获取昨日最大接收时间，导致汇总数据日期数据异常
     * @notice: 追数不会追历史日期当前数据，业务逻辑上只要当天（今天）数据即可。
     */
    void summarySyncEvents();

    /**
     * 处理客户雷达数据
     * @param lastMaxReceiveTime 本系统采集事件表上一次同步最大接收时间
     */
    void handlerRadar(Long lastMaxReceiveTime);

    /**
     * 同步神策访客浏览汇总数据
     * @return 同步神策访客浏览汇总数据
     */
    Boolean syncSaDataBoardTotals();

    /**
     * 神策-日间同步
     *
     * @param dto 同步参数
     */
    default void handler(SyncDTO dto) {
        // 1.0 处理同步参数(上一次同步时间最大接收时间)
        Long receiveTime = this.handleSyncParams(dto);
        // 2.0 同步神策采集明细数据
        Boolean haveEvents = this.syncSaDetails(receiveTime);
        // 3.0 汇总当日访客浏览数据
        this.summarySyncEvents();
        // -- 当有数据才进行后续汇总处理操作
        if (haveEvents) {
            // 4.0 处理客户雷达数据
            this.handlerRadar(receiveTime);
        }
        // 5.0 同步神策访客浏览汇总数据
        this.syncSaDataBoardTotals();
    }

}
